﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CoVuaClient
{
    class OCo
    {
        private string _cot;
        private int _dong;
        private QuanCo _quanCoHienTai;
        private bool _dangChon;
        private string _imagePath;
        public OCo(char cot, int dong)
        {
            Cot = cot.ToString().ToUpper();
            Dong = dong;
            DangChon = false;
            ImagePath = "/CoVuaClient;component/Pic/TrongSuot.png";
        }
        public OCo(int chiSoCot, int chiSoDong)
        {
            Cot = (Convert.ToChar(chiSoCot + Convert.ToInt32('A'))).ToString();
            Dong = chiSoDong + 1;
            DangChon = false;
            ImagePath = "/CoVuaClient;component/Pic/TrongSuot.png";
        }
        public string Cot
        {
            get { return _cot; }
            set { _cot = value; }
        }

        public int Dong
        {
            get { return _dong; }
            set { _dong = value; }
        }

        public QuanCo QuanCoHienTai
        {
            get { return _quanCoHienTai; }
            set { _quanCoHienTai = value; }
        }

        public bool DangChon
        {
            get { return _dangChon; }
            set { _dangChon = value; }
        }

        public string ImagePath
        {
            get { return _imagePath; }
            set { _imagePath = value; }
        }

        public string TenO()
        {
            return Cot.ToString() + Dong.ToString();
        }
        public List<OCo> DanhSachOXungQuanh()
        {
            List<OCo> dsOXungQuanh = new List<OCo>();
            if (CoPhaiCotOBiaBanCo())
            {
                if (CoPhaiDongOBiaBanCo())
                {
                    #region Dong O Bia Cot O Bia
                    if (Cot == "A")
                    {
                        if (Dong == 1)
                        {
                            dsOXungQuanh.Add(new OCo(char.Parse(Cot), Dong + 1));
                            dsOXungQuanh.Add(new OCo(CotKeTiep(), Dong));
                            dsOXungQuanh.Add(new OCo(CotKeTiep(), Dong + 1));
                        }
                        else
                        {
                            dsOXungQuanh.Add(new OCo(char.Parse(Cot), Dong - 1));
                            dsOXungQuanh.Add(new OCo(CotKeTiep(), Dong));
                            dsOXungQuanh.Add(new OCo(CotKeTiep(), Dong - 1));
                        }
                    }
                    else
                    {
                        if (Dong == 1)
                        {
                            dsOXungQuanh.Add(new OCo(char.Parse(Cot), Dong + 1));
                            dsOXungQuanh.Add(new OCo(CotTruoc(), Dong));
                            dsOXungQuanh.Add(new OCo(CotTruoc(), Dong + 1));
                        }
                        else
                        {
                            dsOXungQuanh.Add(new OCo(char.Parse(Cot), Dong - 1));
                            dsOXungQuanh.Add(new OCo(CotTruoc(), Dong));
                            dsOXungQuanh.Add(new OCo(CotTruoc(), Dong - 1));
                        }
                    }
                    #endregion
                }
                else
                {
                    #region Chi Cot O Bia

                    if (Cot == "A")
                    {
                        dsOXungQuanh.Add(new OCo(char.Parse(Cot), Dong - 1));
                        dsOXungQuanh.Add(new OCo(char.Parse(Cot), Dong + 1));
                        dsOXungQuanh.Add(new OCo(CotKeTiep(), Dong - 1));
                        dsOXungQuanh.Add(new OCo(CotKeTiep(), Dong));
                        dsOXungQuanh.Add(new OCo(CotKeTiep(), Dong + 1));
                    }
                    else
                    {
                        dsOXungQuanh.Add(new OCo(char.Parse(Cot), Dong - 1));
                        dsOXungQuanh.Add(new OCo(char.Parse(Cot), Dong + 1));
                        dsOXungQuanh.Add(new OCo(CotTruoc(), Dong - 1));
                        dsOXungQuanh.Add(new OCo(CotTruoc(), Dong));
                        dsOXungQuanh.Add(new OCo(CotTruoc(), Dong + 1));
                    }
                    #endregion
                }
            }
            else
            {
                if (CoPhaiDongOBiaBanCo())
                {
                    #region Chi Dong O Bia

                    if (Dong == 1)
                    {
                        dsOXungQuanh.Add(new OCo(CotKeTiep(), Dong));
                        dsOXungQuanh.Add(new OCo(CotTruoc(), Dong));
                        dsOXungQuanh.Add(new OCo(CotTruoc(), Dong +1 ));
                        dsOXungQuanh.Add(new OCo(char.Parse(Cot), Dong + 1));
                        dsOXungQuanh.Add(new OCo(CotKeTiep(), Dong + 1));
                    }
                    else
                    {
                        dsOXungQuanh.Add(new OCo(CotKeTiep(), Dong));
                        dsOXungQuanh.Add(new OCo(CotTruoc(), Dong));
                        dsOXungQuanh.Add(new OCo(CotTruoc(), Dong - 1));
                        dsOXungQuanh.Add(new OCo(char.Parse(Cot), Dong - 1));
                        dsOXungQuanh.Add(new OCo(CotKeTiep(), Dong - 1));
                    }
                    #endregion
                }
                else
                {
                    #region O Binh Thuong
                    dsOXungQuanh.Add(new OCo(CotTruoc(), Dong - 1));
                    dsOXungQuanh.Add(new OCo(CotTruoc(), Dong));
                    dsOXungQuanh.Add(new OCo(CotTruoc(), Dong + 1));
                    dsOXungQuanh.Add(new OCo(char.Parse(Cot), Dong - 1));
                    dsOXungQuanh.Add(new OCo(char.Parse(Cot), Dong + 1));
                    dsOXungQuanh.Add(new OCo(CotKeTiep(), Dong - 1));
                    dsOXungQuanh.Add(new OCo(CotKeTiep(), Dong));
                    dsOXungQuanh.Add(new OCo(CotKeTiep(), Dong + 1));
                    #endregion
                }
            }
            return dsOXungQuanh;
        }

        public List<OCo> DanhSachOCungCotHoacCungDong(int type)
        {
            List<OCo> dsO = new List<OCo>();
            int denta;
            switch (type)
            {
                case 1:
                    {
                        denta = Dong - 1;
                        for (int i = 0; i < denta; i++)
                        {
                            dsO.Add(new OCo(char.Parse(Cot), Dong - i - 1));
                        }
                        break;
                    }
                case 2:
                    {
                        denta = 8 - Dong;
                        for (int i = 0; i < denta; i++)
                        {
                            dsO.Add(new OCo(char.Parse(Cot), Dong + i + 1));
                        }
                        break;
                    }
                case 3:
                    {
                        denta = Convert.ToInt32(char.Parse(Cot)) - Convert.ToInt32('A');
                        for (int i = 0; i < denta; i++)
                        {
                            dsO.Add(new OCo(Convert.ToChar(Convert.ToInt32(char.Parse(Cot)) - i - 1), Dong));
                        }
                        break;
                    }
                case 4:
                    {
                        denta = Convert.ToInt32('H') - Convert.ToInt32(char.Parse(Cot));
                        for (int i = 0; i < denta; i++)
                        {
                            dsO.Add(new OCo(Convert.ToChar(Convert.ToInt32(char.Parse(Cot)) + i + 1), Dong));
                        }
                        break;
                    }
                default :
                    break;
            }
            return dsO;
        }
        public List<OCo> DanhSachOTrenHaiDuongCheo(int type)
        {
            List<OCo> dsO = new List<OCo>();
            int denta1;
            int denta2;
            switch (type)
            {
                case 1:
                    {
                        #region Dach sách ô ở góc phần tư thứ nhất
                        denta1 = Convert.ToInt32(char.Parse(Cot)) - Convert.ToInt32('A');
                        denta2 = Dong - 1;
                        if (denta1 <= denta2)
                        {
                            if (denta1 != 0)
                            {
                                for (int i = 1; i <= denta1; i++)
                                {
                                    dsO.Add(new OCo(Convert.ToChar(Convert.ToInt32(char.Parse(Cot)) - i), Dong - i));
                                }
                            }

                        }
                        else
                        {
                            if (denta2 != 0)
                            {
                                for (int i = 1; i <= denta2; i++)
                                {
                                    dsO.Add(new OCo(Convert.ToChar(Convert.ToInt32(char.Parse(Cot)) - i), Dong - i));
                                }
                            }
                        }
                        #endregion
                        break;
                    }
                case 2:
                    {
                        #region Dach sách ô ở góc phần tư thứ nhì
                        denta1 = Convert.ToInt32('H') - Convert.ToInt32(char.Parse(Cot));
                        denta2 = Dong - 1;
                        if (denta1 <= denta2)
                        {
                            if (denta1 != 0)
                            {
                                for (int i = 1; i <= denta1; i++)
                                {
                                    dsO.Add(new OCo(Convert.ToChar(Convert.ToInt32(char.Parse(Cot)) + i), Dong - i));
                                }
                            }

                        }
                        else
                        {
                            if (denta2 != 0)
                            {
                                for (int i = 1; i <= denta2; i++)
                                {
                                    dsO.Add(new OCo(Convert.ToChar(Convert.ToInt32(char.Parse(Cot)) + i), Dong - i));
                                }
                            }
                        }
                        #endregion
                        break;
                    }
                case 3:
                    {
                        #region Dach sách ô ở góc phần tư thứ ba
                        denta1 = Convert.ToInt32('H') - Convert.ToInt32(char.Parse(Cot));
                        denta2 = 8 - Dong;
                        if (denta1 <= denta2)
                        {
                            if (denta1 != 0)
                            {
                                for (int i = 1; i <= denta1; i++)
                                {
                                    dsO.Add(new OCo(Convert.ToChar(Convert.ToInt32(char.Parse(Cot)) + i), Dong + i));
                                }
                            }

                        }
                        else
                        {
                            if (denta2 != 0)
                            {
                                for (int i = 1; i <= denta2; i++)
                                {
                                    dsO.Add(new OCo(Convert.ToChar(Convert.ToInt32(char.Parse(Cot)) + i), Dong + i));
                                }
                            }
                        }
                        #endregion
                        break;
                    }
                case 4:
                    {
                        #region Dach sách ô ở góc phần tư thứ tư
                        denta1 = Convert.ToInt32(char.Parse(Cot)) - Convert.ToInt32('A');
                        denta2 = 8 - Dong;
                        if (denta1 <= denta2)
                        {
                            if (denta1 != 0)
                            {
                                for (int i = 1; i <= denta1; i++)
                                {
                                    dsO.Add(new OCo(Convert.ToChar(Convert.ToInt32(char.Parse(Cot)) - i), Dong + i));
                                }
                            }

                        }
                        else
                        {
                            if (denta2 != 0)
                            {
                                for (int i = 1; i <= denta2; i++)
                                {
                                    dsO.Add(new OCo(Convert.ToChar(Convert.ToInt32(char.Parse(Cot)) - i), Dong + i));
                                }
                            }
                        }
                        #endregion
                        break;
                    }
                default:
                    break;
            }
            return dsO;
        }
        
        public List<OCo> DanhSachOQuanMa()
        {
            List<OCo> dsO = new List<OCo>();
            int denta1, denta2, denta3, denta4;
            denta1 = Convert.ToInt32(char.Parse(Cot)) - Convert.ToInt32('A');
            denta2 = Dong - 1;
            denta3 = Convert.ToInt32('H') - Convert.ToInt32(char.Parse(Cot));
            denta4 = 8 - Dong;
            #region Goc phan tu thu nhat
            if (denta1 >= 2)
            {
                if (denta2 >= 2)
                {
                    dsO.Add(new OCo(CotTruoc(), Dong - 2));
                    dsO.Add(new OCo((new OCo(CotTruoc(), 1)).CotTruoc(), Dong - 1));
                }
                else
                {
                    if (denta2 >= 1)
                    {
                        dsO.Add(new OCo((new OCo(CotTruoc(), 1)).CotTruoc(), Dong - 1));
                    }
                    
                }
            }
            else
            {
                if (denta2 >= 2 && denta1 >= 1)
                {
                    dsO.Add(new OCo(CotTruoc(), Dong - 2));
                }               
            }
            #endregion

            #region Goc phan tu thu 2
            if (denta2 >= 2)
            {
                if (denta3 >= 2)
                {
                    dsO.Add(new OCo(CotKeTiep(), Dong - 2));
                    dsO.Add(new OCo((new OCo(CotKeTiep(), 1)).CotKeTiep(), Dong - 1));
                }
                else
                {
                    if (denta3 >= 1)
                    {
                        dsO.Add(new OCo(CotKeTiep(), Dong - 2));
                    }                
                }
            }
            else
            {
                if (denta3 >= 2 && denta2 >= 1)
                {
                    dsO.Add(new OCo((new OCo(CotKeTiep(), 1)).CotKeTiep(), Dong - 1));    
                }
            }
            #endregion

            #region Goc phan tu thu ba
            if (denta3 >= 2)
            {
                if (denta4 >= 2)
                {
                    dsO.Add(new OCo(CotKeTiep(), Dong + 2));
                    dsO.Add(new OCo((new OCo(CotKeTiep(),1)).CotKeTiep(), Dong + 1));
                }
                else
                {
                    if (denta4 >= 1)
                    {
                        dsO.Add(new OCo((new OCo(CotKeTiep(), 1)).CotKeTiep(), Dong + 1));
                    }                   
                }
            }
            else
            {
                if (denta4 >= 2 && denta3 >= 1)
                {
                    dsO.Add(new OCo(CotKeTiep(), Dong + 2));
                }              
            }
            #endregion

            #region Goc phan tu thu tu
            if (denta4 >= 2)
            {
                if (denta1 >= 2)
                {
                    dsO.Add(new OCo(CotTruoc(), Dong + 2));
                    dsO.Add(new OCo((new OCo(CotTruoc(), 1)).CotTruoc(), Dong + 1));
                }
                else
                {
                    if (denta1 >= 1)
                    {
                        dsO.Add(new OCo((new OCo(CotTruoc(), 1)).CotTruoc(), Dong + 1));
                    }                   
                }
            }
            else
            {
                if (denta1 >= 2 && denta4 >= 1)
                {
                    dsO.Add(new OCo(CotTruoc(), Dong + 2));    
                }                
            }
            #endregion
            return dsO;
        }

        public List<OCo> DanhSachOTotBuoc2Buoc(bool pheMinh)
        {
            List<OCo> dsO = new List<OCo>();

            return dsO;
        }
        public bool CoPhaiCotOBiaBanCo()
        {
            if (Cot == "A" || Cot == "H")
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        public bool CoPhaiDongOBiaBanCo()
        {
            if (Dong == 1 || Dong == 8)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        public char CotKeTiep()
        {
            return Convert.ToChar(Convert.ToInt32(char.Parse(Cot)) + 1);
        }
        public char CotTruoc()
        {
            return Convert.ToChar(Convert.ToInt32(char.Parse(Cot)) - 1);
        }

        public void DatQuanCoLenOCo()
        {
            if (Cot == "E" && Dong == 1)
            {
                QuanCoHienTai = new QuanVua(false);
            }
            if (Cot == "D" && Dong == 8)
            {
                QuanCoHienTai = new QuanVua(true);
            }
            if (Dong == 2)
            {
                QuanCoHienTai = new QuanTot(false);
            }
            if (Dong == 7)
            {
                QuanCoHienTai = new QuanTot(true);
            }

            if (Dong == 1)
            {
                if (Cot == "A" || Cot == "H")
                {
                    QuanCoHienTai = new QuanXe(false);
                }
                if (Cot == "B" || Cot == "G")
                {
                    QuanCoHienTai = new QuanMa(false);
                }
                if (Cot == "C" || Cot == "F")
                {
                    QuanCoHienTai = new QuanTinh(false);
                }
                if (Cot == "D")
                {
                    QuanCoHienTai = new QuanHau(false);
                }
            }
            if (Dong == 8)
            {
                if (Cot == "A" || Cot == "H")
                {
                    QuanCoHienTai = new QuanXe(true);
                }
                if (Cot == "B" || Cot == "G")
                {
                    QuanCoHienTai = new QuanMa(true);
                }
                if (Cot == "C" || Cot == "F")
                {
                    QuanCoHienTai = new QuanTinh(true);
                }
                if (Cot == "E")
                {
                    QuanCoHienTai = new QuanHau(true);
                }
            }
        }

        public List<OCo> NhungOCoTheDi(BanCo banCo, bool kiemTraChieuTuong)
        {
            List<OCo> danhSach = new List<OCo>();
            if (kiemTraChieuTuong)
            {
                if (QuanCoHienTai != null && !QuanCoHienTai.PheMinh)
                {
                    danhSach = QuanCoHienTai.NhungOCoTheDi(banCo, this, kiemTraChieuTuong);
                }
            }
            else
            {
                if (QuanCoHienTai != null && QuanCoHienTai.PheMinh)
                {
                    danhSach = QuanCoHienTai.NhungOCoTheDi(banCo, this, false);
                }
            }
            
            
            return danhSach;
        }
        public void ChangeState()
        {
            DangChon = !DangChon;
            if (DangChon)
            {
                ImagePath =  "/CoVuaClient;component/Pic/TrongSuotChecked.png";
            }
            else
            {
                ImagePath =  "/CoVuaClient;component/Pic/TrongSuot.png";
            }
        }
    }
}
